Git 常用命令和问题

前言

文章记录自己对 Git 操作的理解,和一些在使用过程中遇到的问题和解决方法,不定时更新


Git 常用命令

  • 查看分支

    git branch
  • 创建分支

    git checkout -b newbranch
  • 切换分支

    git checkout newbranch
  • 添加到暂存区

    git add <file>
    git add .

    这两个一个是添加单个文件,一个是添加所有改动的文件,如果改动的文件多,可以先使用第二个命令添加所有文件,然后再 使用 git restore <file> 将不需要提交修改的文件移出来。

  • 提交代码

    git commit -m "feat: xxx"

    新功能可以用feat,对原来代码的修改可以用 fix,具体的规范可以参照

  • 本地合并代码

    git checkout newbranch
    git merge origin/develop

    这两个命令将本地的 develop 分支代码合并到 newbranch 分支

  • 删除本地分支

    git branch -d <name>

    强制删除:git branch -D <name>

  • 删除远端分支

    git branch -a 查看远端和本地的所有分支
    git push origin :远端分支 push一个空的到远端分支,注意origin 后面的空格

git 准备开发的流程

  1. 本地切换到 develop 分支,将远程 develop 分支拉到本地,合并 (*develop)

    git pull origin develop

    合并如果有冲突,git statusgit diff 看是哪些文件有冲突,到文件里解决冲突,再git reset --merge

  2. 在 develop 上分出一个开发分支 xxx (*develop)

    git checkout -b xxx
  3. 切换到 xxx 分支进行开发 (*xxx)

开发完毕提交操作

  1. 切换到 develop 分支,如果提示没有 commit 或者 stash 就 stash

  2. 在 develop 分支上拉取远端最新的代码

    git pull origin develop
  3. 切换到开发分支 xxx,将 develop 分支里最新的代码合并到开发分支

    git checkout xxx
    git merge origin/develop

    如果有冲突,解决冲突重新合并

    git reset --merge
  4. 提交开发分支中的改动

    git add <file>
    git commit -m "feat: xxx"

    在开发分支中 git log 时有之前的提交记录是正常的,提交到远端的新分支之后有之前的提交记录也是正常的,不要慌。创建 MergeRequest 的时候就只有这一次推送的提交了

    如果add错了一个文件,git restore --staged 可以撤销这个文件的

  5. 推送到远端

    git push origin xxx:yyy

    使用这个命令后,会将本地的 xxx 分支推送远端自动新建的 yyy 分支

    推送的是距离你从本次开发开始的提交记录,比如从远端拉下来合并之后有了commit1, commit2, commit3 这几个提交记录,本次开发过程中提交了两次:commit4 和 commit5,那么推送的也就是这两个记录,在创建 Merge Request 的时候 commits 也是 2

  6. 创建 Issue 和 MergeRequest

    Issue 可以不在这个时候创建,开发功能之前就可以创建了,意味着自己要开发新功能了

    MergeRequest 就是合并请求,我这里是新功能分支 合并到 develop 分支,merge 之后自动删除 userperm 分支。具体的看公司要求。

    image-20201106094925485

Q&A

已经 commit 但没有push ,想要撤销本次提交,但要保留代码修改?

使用 git log 打印提交记录,看到如下提交信息

image-20201106095904118

现在,我们想要撤销第一个和第二个提交记录,但又不想代码也跟着回滚,于是,我们可以用git reset --soft HEAD^ 命令来撤销第一个提交,也就是bcee1b 的提交,然后再用一次 git reset --soft HEAD^ 就成功撤销这两个记录了。

你也可以使用git reset --soft HEAD~2 来一次性撤销两个提交记录,现在,我们使用 git log 查看提交记录:

可以看到已经撤销了两次提交。

使用这个命令,git add 操作不会被撤销,使用 git status 查看状态,之前 add 的记录还在:

![image][2]

image-20201106101956645

撤销提交记录的同时不保留代码修改怎么做?

使用 git reset --hard HEAD^ 就可以办到。这个命令会删除改动的代码,撤销 commit 和 add,恢复到上一次的 commit 状态。

恢复到上一次提交记录之后又后悔了怎么办?

刚刚使用了 git reset --hard HEAD^ 命令恢复了上一次的 commit 状态,同时代码也没有被保存,如果后悔了,可以使用 git reflog 命令查看之前所有的提交记录和操作记录,找到需要恢复的那个版本,复制前面的 commitID,例如我们想要回到bcee1b4 这个版本:

![image][3]

使用命令,然后查看 提交记录:

![image][4]

image-20201106103257356

又回来了。

在 commit 的时候写错注释了怎么办?

git commit --amend

这个命令会默认进入 vim 编辑器,修改好注释之后保存就可以了。

已经 push 到远端还没合并,需要修改代码

如果已经将本地的开发分支 push 到远端,但是这个时候不管出于什么原因需要修改代码,但是修改好了之后提交到远端,发起 MergeRequest 的时候是没有原来的提交记录的。比如我第一次 push 的时候有 commit-1 的记录,现在在本地改了代码,有了 commit-2 的记录,然后 push 到了一个新的远端分支 zzz ,在这个新的分支上再建一个 Merge Request,那么这个 MergeRequest 里面就只有一个 commit。

可以参考第一个问题,在本地撤销前面的 commit 但保留更改,然后重新提交,这样下一次提交就包含了两次的修改。

或者也可以在修改代码之后 push 到远端上一次push 的 yyy 分支上,这样远端就有了两个 commit ,看自己的需求。

如何同步远程已删除的分支

删除远端多余分支

使用 git branch -a 命令查看本地和远程的所有分支,红色部分就是远端分支

image-20201106111008267

可以看到,有的远端分支明明已经删除了,但本地并没有同步过来。

使用 git remote show origin 命令查看本地分支和远端分支的追踪情况

根据提示,可以使用 git remote prune 命令来同步删除这些分支。

git remote prune

再次查看就已经删除这些多余的分支了image-20201106111856467](C:/Users/Lenovo/AppData/Roaming/Typora/typora-user-images/image-20201106111856467.png)

删除本地多余分支

git branch -D feature/chatfix

[]: